package com.bjsxt.commu2;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {
    private String name;
    private String color;
    boolean flag = false;       // true表示有产品，false表示没有产品


    public synchronized void produce(int i) {
        //判断仓库是否为空，仓库不为空则等待消费
        if (flag) {
            try {
                this.wait();     //（必须使用同步监视器的wait()方法、必须在同步块中）
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        if (i % 2 == 0) {
            this.name = "馒头";
            try {
                Thread.sleep(10);       //只释放CPU，不释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.color = "白色";
        } else {
            this.name = "面包";
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.color = "黄色";
        }

        System.out.println("生产者生产一件商品：" + name + "，" + color);

        //改变仓库状态
        this.flag = true;

        //唤醒消费者
        this.notify();       //随机唤醒一个线程（目前只有2个），唤醒的一定是消费者
    }

    public synchronized void consume() {
        //如果仓库为空，则等待生产者生产
        if (!flag) {
            try {
                this.wait();     //线程等待，释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("消费者消费一件商品：" + name + "，" + color);

        //改变仓库状态
        this.flag = false;

        //唤醒生产者
        this.notifyAll();        //唤醒所有等待的线程（目前等待的只有1个，就是消费者）
    }
}
